package chapter8;

//Dynamic Method Dispatch
class Dispatch {

	static class A {
		void callme() {
			System.out.println("Inside A's callme method");
		}
	}

	static class B extends A {
		// override callme()
		void callme() {
			System.out.println("Inside B's callme method");
		}
	}

	static class C extends A {
		// override callme()
		void callme() {
			System.out.println("Inside C's callme method");
		}
	}

	public static void main(String args[]) {
		A a = new A(); // object of type A
		B b = new B(); // object of type B
		C c = new C(); // object of type C
		A r; // obtain a reference of type A
		r = a; // r refers to an A object
		r.callme(); // calls A's version of callme
		r = b; // r refers to a B object
		r.callme(); // calls B's version of callme
		r = c; // r refers to a C object
		r.callme(); // calls C's version of callme
	}
}